# 处理数据样本的代码可能会变得混乱且难以维护；
# 理想情况下，我们希望数据集代码与模型训练代码分离，以提高可读性和模块化
# PyTorch 提供了两个数据原语：torch.utils.data.DataLoader 和 torch.utils.data.Dataset，允许您使用预加载的数据集以及您自己的数据。
# Dataset 存储样本及其对应的标签，DataLoader 将可迭代对象包装在 Dataset 周围，以便于访问样本。
# PyTorch 领域库提供了一些预加载的数据集（例如 FashionMNIST），它们是 torch.utils.data.Dataset 的子类，并实现了特定于特定数据的函数。
# 它们可用于对您的模型进行原型设计和基准测试。您可以在此处找到它们：图像数据集、文本数据集 和 音频数据集

# 加载数据集

# 以下是如何从 TorchVision 加载 Fashion-MNIST 数据集的示例。Fashion-MNIST 是一个包含 Zalando 文章图像的数据集，包含 60,000 个训练样本和 10,000 个测试样本。
# 每个样本都包含一个 28×28 的灰度图像以及来自 10 个类别之一的关联标签.

# 我们使用以下参数加载数据集;
# root - 数据集的根目录
# train - 指定训练集或测试数据集
# download = True 如果root中没有数据集，则从互联网下载数据集
# transform 和 target_transform 指定特征和标签转换

import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt


training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)


labels_map = {
    0: "T-Shirt",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7: "Sneaker",
    8: "Bag",
    9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()
    img, label = training_data[sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.title(labels_map[label])
    plt.axis("off")
    plt.imshow(img.squeeze(), cmap="gray")
plt.show()







